/*
客户端要发一个头Range:bytes=0-10
服务端返回一个头
Accept-Ranges:bytes
Content-Range:0-10/总大小
*/
const http = require('http');
const fs = require('fs');
const path = require('path');
const stat = require('util').promisify(fs.stat);
const resolve = filepath => path.join(__dirname, filepath);

const server = http.createServer(async (req, res) => {
  const p = resolve('content.txt');
  const statObj = await stat(p);
  console.log('statObj:',statObj);
  let start = 0;
  let end = statObj.size - 1; //流是包前又包后的，我们一般返回的Content-Range也因此也是包前又包后的 //emmm 这里size获取到是60，因为还有5 x \r\n(0x0d 0x0a) 即5个换行 共计10个字节(如果是mac里创建的文本应该就是5个\n 即0x0a 共计5个字节)
  let total = end;
  const range = req.headers['range'];
  if (range) {
    res.setHeader('Accept-Ranges', 'bytes'); // 这里设置此头，以标识服务器支持范围请求
    let result = range.match(/bytes=(\d*)-(\d*)/);
    console.log('result:', result);//['匹配的整个字符串','第一个分组']
    start = result[1] ? parseInt(result[1]) : start;
    end = result[2] ? parseInt(result[2]) : end;
    res.setHeader('Content-Range', `${start}-${end}/${total}`);
  }
  res.setHeader('Content-Type', 'text/plain;charset=utf-8');
  fs.createReadStream(p,{start,end}).pipe(res);
});

server.listen(3000);
